﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;
using System.Web;
using System.Web.SessionState;

namespace BOL.Ventas
{
   
       public class ProformaBL
       {
           public int Add(DateTime fecha,
                            int idProyecto,
                            string nombre,
                            string docCliente,
                            string apellido,
                           string direccion,
                            string  telefono  ,
                            string celular,
                             string email,
                           int idFormatoVenta,
                            int idBanco,
                            int idMoneda,
                            DataSet entitylist,
                          int idPregusnta1,
                            string observacionInter,
                                   string observacionFinan,
                                   string tipoIngreso)
           {
               using (TransactionScope ts = new TransactionScope())
               {

                   dbGestionDataContext _db =
                       new dbGestionDataContext(Parametros.strConnString);

                   //datos de la empresa y empleado
                   int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                   

                   DAL.Proforma proforma = new DAL.Proforma();

                   Moneda monedaAct = _db.Monedas.Single(p => p.idInternal == 4);
                   decimal tp = monedaAct.getTipoCambio(_db, fecha);

                   DateTime dt = new DateTime(fecha.Year, fecha.Month, fecha.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                   var proyecto = _db.Proyectos.Single(p => p.idInternal == idProyecto);
                   if (!proyecto.logo.HasValue() | proyecto.logo == string.Empty)
                   {
                       throw new Exception("Verifique logo de la obra");
                   }

                   //--------
                 
                   var items = (from a in entitylist.Tables["ORDENVENTAITEMINFO"].AsEnumerable().Where(p => p.RowState != DataRowState.Deleted)
                                select a).AsEnumerable();


                   var formatoVenta = _db.FormatoVentas.Single(p => p.idinternal == idFormatoVenta);

                   CuentaFinanciamiento cuentafinanciamiento = _db.CuentaFinanciamientos.Single(p => p.idBanco == idBanco & p.idProyecto == idProyecto);

                   var formatoVentaCal = new OrdenVentaBL().calcularFormatoVenta(_db,formatoVenta,fecha.Year, items, cuentafinanciamiento);

                   //-------------

                   int? idban = (idFormatoVenta == 1) ? null : idBanco.ToInt2();

                   proforma.SetAdd(_db, proforma.getCorrelativo(_db, idProyecto),
                                   idProyecto,
                                   nombre,
                                   docCliente,
                                   apellido,
                                   direccion,
                                   telefono,
                                   celular,
                                   email,
                                   idMoneda,
                                   dt,
                                   idPregusnta1,
                                    idUsuarioCre,
                                   idFormatoVenta, idban,
                                   tp,
                                    formatoVentaCal.bono,
                                   formatoVentaCal.creditoHipotecario,
                                   formatoVentaCal.contado,
                                   observacionInter,
                                   observacionFinan,
                                   tipoIngreso
                                   
                                   );


                   _db.SubmitChanges();
                   DataSet dsDiferencias = new DataSet();

                   if (entitylist.Tables["OrdenVentaItemInfo"].Rows.Count == 0)
                   {
                       throw new Exception("No debe existir Proforma sin Items");
                   }

                   if (entitylist.HasChanges())
                   {
                       dsDiferencias.Merge(entitylist.GetChanges());

                      
                       foreach (DataRow drw in dsDiferencias.Tables["OrdenVentaItemInfo"].Rows)
                       {
                           if (drw.RowState == DataRowState.Added)
                           {
                               var UI = _db.UIs.Single(p => p.idInternal == drw.Field<int>("idUI"));
                               string descripcion=string.Format("PROYECTO:{0},ETAPA:{1}, {2}, {3},{4}",
                                                          UI.Etapa.Proyecto.descripcion,
                                                          UI.Etapa.descripcion,
                                                          UI.UILocalizacion.descripcion,
                                                          UI.UIBloque.descripcion,
                                                          UI.descripcion);


                               ProformaItem proformaItem = new ProformaItem();
                               proformaItem.AddSet(_db,
                                      proforma.idInternal,
                                      descripcion,
                                      drw.Field<int>("idUI"),
                                      UI.idMoneda,
                                      UI.precio,
                                      drw.Field<decimal>("totalSeparacion"),
                                      drw.Field<bool>("bitFinanciado"));
                               // su formato de Venta
                               _db.SubmitChanges();
                               
                              

                           }

                       }
                       //calulo en sol o en doll


                       decimal totalSol = _db.ProformaItems.Where(P => P.idProforma == proforma.idInternal & P.idMoneda == 3).Sum(O => O.total);
                                        decimal totaldol =0;
                       if  (_db.ProformaItems.Where(P => P.idProforma == proforma.idInternal & P.idMoneda == 4).Count()!=0)
                                totaldol = _db.ProformaItems.Where(P => P.idProforma == proforma.idInternal & P.idMoneda == 4).Sum(O => O.total);

                       decimal total = totalSol + totaldol * proforma.tipoCambio;

                       proforma.SetUpdatetotal(total);

                   }
                   _db.SubmitChanges();
                   ts.Complete();
                   return proforma.idInternal;
                   }

               
           }

           public void Update(int idProforma,
                               
                                string nombre,
                                string docCliente,
                                string apellido,
                               string direccion,
                                string telefono,
                                string celular,
                                 string email,
                               int idFormatoVenta,
                               int idBanco,
                                int idMoneda,
                               int idPregusnta1,
                               string observacionInter,
                               string observacionFinan,
                               string tipoIngreso,
                               DataSet entitylist)
               
           {
               using (TransactionScope ts = new TransactionScope())
               {

                   dbGestionDataContext _db =
                       new dbGestionDataContext(Parametros.strConnString);

                   //datos de la empresa y empleado
                   int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                   

                   DAL.Proforma proforma = _db.Proformas.Single(p => p.idInternal == idProforma);

               //--------
                
             var items = (from a in entitylist.Tables["ORDENVENTAITEMINFO"].AsEnumerable().Where(p => p.RowState != DataRowState.Deleted)
                       select a).AsEnumerable();
                                             
            
            var formatoVenta= _db.FormatoVentas.Single(p=>p.idinternal==idFormatoVenta);

            CuentaFinanciamiento cuentafinanciamiento=_db.CuentaFinanciamientos.Single(p=>p.idBanco==idBanco& p.idProyecto==proforma.idProyecto);
             
            var formatoVentaCal = new OrdenVentaBL().calcularFormatoVenta(_db,formatoVenta,proforma.fecha.Year, items, cuentafinanciamiento);

            //-------------
           
            
                int? idban =(idFormatoVenta == 1) ? null : idBanco.ToInt2();
           

                   proforma.SetUpdate(nombre,
                                    docCliente,
                                   apellido,
                                   direccion,
                                   telefono,
                                   celular,
                                   email,
                                   idMoneda,
                                   idPregusnta1,
                                   idUsuarioCre,
                                   idFormatoVenta,
                                   idban,
                                   formatoVentaCal.bono,
                                   formatoVentaCal.creditoHipotecario,
                                   formatoVentaCal.contado,
                                   observacionInter,
                                   observacionFinan,
                                   tipoIngreso);

                   //registramos las UI
                   _db.SubmitChanges();

                  
                   DataSet dsDiferencias = new DataSet();


                   if (entitylist.HasChanges())
                   {
                       dsDiferencias.Merge(entitylist.GetChanges());

                       foreach (DataRow drw in dsDiferencias.Tables["OrdenVentaItemInfo"].Rows)
                       {
                           if (drw.RowState == DataRowState.Modified)
                           {

                               // no puede cambiar la unidad inmobilario si existe documentos de venta  registrado
                               var UI = _db.UIs.Single(p => p.idInternal == drw.Field<int>("idUI"));

                               string descripcion = string.Format("PROYECTO:{0},ETAPA:{1}, {2}, {3},{4}",
                                                        UI.Etapa.Proyecto.descripcion,
                                                        UI.Etapa.descripcion,
                                                        UI.UILocalizacion.descripcion,
                                                        UI.UIBloque.descripcion,
                                                        UI.descripcion);

                               ProformaItem ordenVentaitem = _db.ProformaItems.Single(p => p.idInternal == drw.Field<int>("idInternal"));

                                       ordenVentaitem.UpdateSet(UI.idMoneda,
                                           UI.idInternal,
                                           descripcion,
                                           UI.precio,
                                            drw.Field<decimal>("totalSeparacion"),
                                           drw.Field<bool>("bitFinanciado"));
                              

                               _db.SubmitChanges();

                           }
                           if (drw.RowState == DataRowState.Deleted)
                           {
                               drw.RejectChanges();
                               ProformaItem ordenVentaitem = _db.ProformaItems.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                               _db.ProformaItems.DeleteOnSubmit(ordenVentaitem);

                              _db.SubmitChanges();
                           }


                           if (drw.RowState == DataRowState.Added)
                           {
                               var UI = _db.UIs.Single(p => p.idInternal == drw.Field<int>("idUI"));
                               string descripcion = string.Format("PROYECTO:{0},ETAPA:{1}, {2}, {3},{4}",
                                                UI.Etapa.Proyecto.descripcion,
                                                UI.Etapa.descripcion,
                                                UI.UILocalizacion.descripcion,
                                                UI.UIBloque.descripcion,
                                                UI.descripcion);
                               ProformaItem ordenVentaItem = new ProformaItem();
                               ordenVentaItem.AddSet(_db,
                                      proforma.idInternal,
                                      descripcion,
                                      drw.Field<int>("idUI"),
                                      UI.idMoneda,
                                      UI.precio,
                                       drw.Field<decimal>("totalSeparacion"),
                                      drw.Field<bool>("bitFinanciado"));
                               // su formato de Venta

                               _db.SubmitChanges();
                           
                           }

                       }


                   }
                   decimal totalSol = _db.ProformaItems.Where(P => P.idProforma == proforma.idInternal & P.idMoneda == 3).Sum(O => O.total);
                   decimal totaldol = 0;
                   if (_db.ProformaItems.Where(P => P.idProforma == proforma.idInternal & P.idMoneda == 4).Count() != 0)
                       totaldol = _db.ProformaItems.Where(P => P.idProforma == proforma.idInternal & P.idMoneda == 4).Sum(O => O.total);

                   decimal total = totalSol + totaldol * proforma.tipoCambio;

                   proforma.SetUpdatetotal(total);
                   _db.SubmitChanges();
                   ts.Complete();
                 
               }

           }


           public void Delete(int idProforma)
           {
               using (TransactionScope ts = new TransactionScope())
               {

                   dbGestionDataContext _db =
                       new dbGestionDataContext(Parametros.strConnString);

                   //datos de la empresa y empleado
                   int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                   

                   
                   var db = _db.Proformas.Single(p => p.idInternal == idProforma);

                   _db.ProformaItems.DeleteAllOnSubmit(db.ProformaItems);
                   _db.Proformas.DeleteOnSubmit(db);

                   _db.SubmitChanges();
                   ts.Complete();

               }
           }

           //public IEnumerable<ProformaListInfo> GetProformaList(int idProyecto)
           //{
           //    var q = from a in DbUtil.Db.Proformas
           //            where a.idProyecto == idProyecto
           //            select new ProformaListInfo
           //            {
           //                 nombres=String.Format("{0} {1}",a.nombre,a.apellido),
           //                  direccion=a.direccion,
           //                   docCliente=a.docCliente,
           //                    email=a.email,
           //                     fecha=a.fecha,
           //                      formatoVentaStr=a.FormatoVenta.descripcion,
           //                       idInternal=a.idInternal,
           //                        idProyecto=a.idProyecto,
           //                         moneda=a.Moneda,
           //                          numDocumento=a.numDocumento,
           //                           pregusnta1=a.GrupoDatoitem.descripcion,
                                    
           //                             telefono=a.telefono,
           //                              total=a.total,
           //                               ui1Str=string.Format("{0} {1} {2}",a.UI.Etapa.descripcion,
           //                                                               a.UI.UILocalizacion.descripcion,
           //                                                               a.UI.UIBloque.descripcion),
           //                 ui2Str =(a.ui2!=null? string.Format("{0} {1} {2}", a.UI.Etapa.descripcion,
           //                                                 a.UI.UILocalizacion.descripcion,
           //                                                 a.UI.UIBloque.descripcion):"")
                                          

           //            };

           //    return q;
           //}



           public List<OrdenVentaItemInfo> GetProformaItem(int idProforma)
           {
               var q = from a in DbUtil.Db.ProformaItems
                       where a.idProforma == idProforma
                       select new OrdenVentaItemInfo
                       {
                           bitFinanciado = a.bitFinanciado,
                           codigo = a.UI.codigo,
                           descripcion = a.UI.descripcion,
                           idInternal = a.idInternal,
                           idUI = a.idUI,
                           localizacion = a.UI.UILocalizacion.descripcion,
                           LocalizacionStr = string.Format("{0} {1}", a.UI.UILocalizacion.descripcion, a.UI.UIBloque.descripcion),
                           moneda = a.UI.Moneda,
                           piso = a.UI.UIBloque.descripcion,
                           etapa = a.UI.Etapa.descripcion,
                           total = a.total,
                           totalSeparacion=a.separacion,
                           idOrdenVenta = a.idProforma,

                       };

               return q.ToList();
           }
          

           public List<ProformaRPTInfo> GetProformaRpt(int idProforma)
           {

             string archivoLogo = DbUtil.Db.Proformas.Single(p=>p.idInternal==idProforma).Proyecto.logo;
             
            
              
                byte[] firma= new byte[200];
               
                if (archivoLogo == null)
                {
                    firma = null;
                }
                else
                {
                    string rutaFirma = System.Web.HttpContext.Current.Server.MapPath("../App_Data/Proyecto/Logo/"  + archivoLogo);
                    firma = UtilityExtensions.Util.FileToBytesImage(rutaFirma);
                }



                var q = from a in DbUtil.Db.ProformaItems
                        where a.idProforma == idProforma
                        select new ProformaRPTInfo
                        {

                            bono = String.Format("{0:N}",a.Proforma.bono.Value),
                            direccion = a.Proforma.direccion,
                            email = a.Proforma.email,
                            entidadFinanciera = a.Proforma.Banco.descripcion,

                            fecha = a.Proforma.fecha.ToShortDateString(),
                            descripcion = a.descripcion,
                            formatPago = a.Proforma.FormatoVenta.descripcion,
                            hora = a.Proforma.fecha.ToShortTimeString(),
                            inicial =String.Format("{0:N}", a.Proforma.contado.Value),
                            logo = firma,
                            nombres = String.Format("{0} {1}", a.Proforma.nombre, a.Proforma.apellido),
                            numDocumento = a.Proforma.numDocumento,
                            precio = String.Format("{0:N}",a.total),
                            proyecto = a.Proforma.Proyecto.descripcion,
                            proyectoEmail = a.Proforma.Proyecto.email,
                            proyectoDireccion=a.Proforma.Proyecto.direccion,
                            proyectoWeb = a.Proforma.Proyecto.web,
                            saldoFinanciar = String.Format("{0:N}",a.Proforma.financiado.Value),
                            telefono = a.Proforma.telefono,
                            separacion = String.Format("{0:N}", a.separacion),
                            total = String.Format("{0:N}",a.Proforma.total),
                            vendedor = a.Proforma.Empleado1.descripcion,
                            vendedorEmail = a.Proforma.Empleado1.email,
                            vendedorTelefono = a.Proforma.Empleado1.telefono
                        };

                return q.ToList();
                      }

       }
  
}
